//
//  BZAudioRecorder.h
//  BZFoundation
//
//  Created by 郭艺伟 on 2017/9/28.
//  Copyright © 2017年 郭艺伟. All rights reserved.
//

#import <Foundation/Foundation.h>

#import <CoreGraphics/CoreGraphics.h>

@class AVAudioRecorder;

typedef NS_ENUM(NSInteger, MUPAudioRecordErrorType) {
    // 仅在录音开始时产生的错误
    BZAudioRecordErrorTypeFoundMic = 0,	    //没有找到麦克风
    BZAudioRecordErrorTypeAccessMic,			//无法访问麦克风
    BZAudioRecordErrorTypeIsRecording,         //正在录音中
    BZAudioRecordErrorTypeCreateFile,         //创建文件失败
    // 正在转换中无法开始录音。仅在前一个录音开启边录音边转换的同时有可能出现
    BZAudioRecordErrorTypeConvertion,
    
    // 仅在录音结束时产生的错误
    BZAudioRecordErrorTypeAudioDuringShort		//录音太短
};

FOUNDATION_EXPORT NSString * const BZAudioRecordErrorDomain;

typedef void (^BZAudioRecordConversionBlock)(NSURL *filePath, NSError *error);

@class BZAudioRecorder;

@protocol BZAudioRecorderDelegate <NSObject>

@optional
/**
 *   实例已经开始录音
 *
 *    @param recorder 已经开始录音的实例 AudioRecorder 对象
 */
- (void)audioRecorderDidBeginRecord:(BZAudioRecorder *)recorder;

/**
 *    实例已经保存音频文件至指定目录，完成录音
 *
 *    @param recording     已经完成录音的实例 AudioRecorder 对象
 *    @param audioFilePath 录音音频文件保存的路径
 */
- (void)audioRecorderDidFinishRecording:(BZAudioRecorder *)recorder
                               filePath:(NSURL *)filePath
                                  error:(NSError *)error;

/**
 *    录音中断
 *
 *    @param recorder     中断录音的实例 AudioRecorder 对象
 */
- (void)audioRecorderDidBeginInterruption:(BZAudioRecorder *)recorder;

/**
 *    录音中断
 *
 *    @param recorder     中断录音的实例 AudioRecorder 对象
 */
- (void)audioRecorderDidEndInterruption:(BZAudioRecorder *)recorder;

@end

@interface BZAudioRecorder : NSObject
/**
 *  最近一次成功录音使用的路径。
 */
@property (nonatomic, copy, readonly) NSURL *latestFilePath;


/**
 *  录音文件的存储目录。在不设置的情况下，目录默认采用 Documents 下 AudioTmp 文件夹。
 */
@property (nonatomic, copy) NSURL *audioDirectory;

/**
 * 可以使用这个变量来指定最短录音的时长，单位为秒，不能短于1秒。
 * 默认使用内部设置最短录音时长一秒
 */
@property (nonatomic, assign) NSTimeInterval minimumDuration;

/**
 * 可以使用这个变量来指定最长录音的时长。单位为秒。
 * 默认值为120秒。录音会在到达最大时长时自动结束。
 */
@property (nonatomic, assign) NSTimeInterval maximumDuration;


/**
 *  目前录制的长度，单位为秒。如果已经被终止了，返回零。
 */
@property (nonatomic, assign, readonly) NSTimeInterval currentTime;


@property (nonatomic, weak) id<BZAudioRecorderDelegate> delegate;

/**
 *  返回一个 AudioRecorder 单例。
 *
 *  @return 一个 AudioRecorder 单例。
 */
+ (instancetype)sharedInstance;


/**
 *  开始录音。
 *
 *  @param error 开始录音时返回的错误。
 *
 *  @return 录音是否成功开始。
 */
- (BOOL)recordWithError:(NSError **)error;

/**
 *  开始录音的同时开始转码为 Amr 文件。
 *
 *  @param error    开始录音时返回的错误。
 *  @param callback 转码完成时被调用的 callback，与录音结束的时刻非常接近。
 *
 *  @return 录音是否成功开始。
 */
- (BOOL)recordWithError:(NSError **)error conversionCompleteBlock:(BZAudioRecordConversionBlock)callback;

/**
 *  暂停录音。
 */
- (void)pause;


/**
 *  恢复录音。
 */
- (void)resume;

/**
 *  结束录音。
 */
- (void)stop;

/**
 *  取消录音。
 */
- (void)cancel;

/**
 *  判断是否正在录音
 *
 *  @return 是否正在录音
 */
- (BOOL)isRecording;


/**
 *  获取当前 Channel 0 下录制的声音的音量
 *
 *  @return 返回一个在 [－160, 0] 之间的值表示音量
 */
- (CGFloat)averagePower;


/**
 *  获取指定 Channel 下录制的声音的音量
 *
 *  @param channelNumber 频道号
 *
 *  @return 返回一个在 [－160, 0] 之间的值表示音量
 */
- (CGFloat)averagePowerWithChannel:(NSUInteger)channelNumber;

@end
